const a :number = 12;

const str : string = 'hello';

const bol : boolean  = true;

// 如果没有给数组添加一个类型 就会默认 never类型 
// 数组只能添加数字
const arr : string [] = []; 
const arr2 : Array<string> =[];

arr2.push('1');

arr.push(...['1','2']);

// 声明一个接口 创建项目 不能有中文 / 空格 / 特殊字符 , / 
// 类 : 首字母一定大写 
// 接口首字母也要大写
// 规范一个对象的key值
interface IProps  {
  a: number,
  b : string
}

// object : 只能限定 obj 是一个对象 : 不能限制key是什么值 
const obj : object = {a:10};
// 接口 interface
const obj1 : IProps = {a:20 ,b:'10'}

obj1.a = 20;

const nullValue : null = null;
let undefinedValue : undefined 
// ts 不存在隐士转换的
undefinedValue =  undefined

let never : never 

// 什么都赋值不了
// never

function getValue2 (str:string):number {
  // 返回值必须是数字
  return parseInt(str);
}

// never应用场景 :函数 不希望有返回值并且报错
function getValue():never{
  throw new Error('出错了')
}


getValue2('123')

// 写一个函数 : 参数是一个对象 {a string, b:number}
// 返回一个数组  数组的类型是一个对象 {key:string,name:string}


interface IParams{
  a:string,
  b:number
}
interface IArrayParams{
  key: string,
  name:string
}
function getData(params:IParams):Array<IArrayParams>{
  let data :IArrayParams
  data = {key:'1',name:'张三'}
  return [data,data]
}

const res = getData({a:'123',b:12})

res.map(item=>{
  console.log(item.key);
  console.log(item.name);
})


// 实现一个函数 要求参数第一个也是一个函数(参数是 a:string 返回值是string) 
// 返回值是一个对象里面有{abc:{bcd:string,isCard:boolean}}

interface InnerType {
  bcd:string,
  isCard : boolean
}

interface IReturnType {
  abc: InnerType
}
// 一个参数  (a:string)=>string : 函数的类型
// 函数 和 函数类型
// ()=>{函数体}
// ()=>string : 函数类型
function getInterface(fn : (a:string)=>string):IReturnType{
  return {abc : {bcd:'zhangsan',isCard:true}}
}

// 如果 fn:Function 不能约束参数和返回值
getInterface((a:string):string=>{
  return '10'
})

// number string boolean Array: Array<string>  IProps[] 
// 对象 : 用接口约束  interface IProps{key:string} 
// 函数 : ()=>类型
// never : 函数的返回值 报错
// void : 空
function abc ():void{
  // typeof null : object
  return
}

